/*
	This file is part of AVRCppLib.

    AVRCppLib is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    AVRCppLib is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with AVRCppLib.  If not, see <http://www.gnu.org/licenses/>.

    Copyright (C) Maxime Lemonnier 2007-2011
 */

#include "ADCSensor.h"
#include "Sample.h"


ADCSensor::ADCSensor(ADCHardware * adcHardware, ChannelMode channelMode, uint8_t SLEEP_MODE) :
adcHardware(adcHardware), channelMode(channelMode), SLEEP_MODE(SLEEP_MODE), isConversionComplete(false)
{

}

ADCSensor::~ADCSensor()
{
	// TODO Auto-generated destructor stub
}


void ADCSensor::callback()
{
	isConversionComplete = true;
}

AbstractSample ADCSensor::read()
{
	adcHardware->setChannelMode(channelMode);
	adcHardware->connectCallback(this);
	adcHardware->enableInterrupts();
    isConversionComplete = false;
    set_sleep_mode(SLEEP_MODE);
    while(!isConversionComplete)
	{
		sleep_mode();
	}
    adcHardware->disableInterrupts();

    adcHardware->disconnectCallback();

    return Sample<uint16_t>(adcHardware->read());
}
